﻿using System;
using System.Runtime.InteropServices;


namespace WindowsAPI.Windows
{

    /// <summary>API-функции работы с окнами</summary>
    public static partial class API
    {

        ///// <summary>Найти окно</summary>
        ///// <param name="lpClassName">Имя класса</param>
        ///// <param name="lpWindowName">Заголовок</param>
        ///// <returns>Дескриптор найденого окна</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        ///// <summary>Найти окно</summary>
        ///// <param name="hWndParent">Дескриптор окна предка</param>
        ///// <param name="hwndChildAfter">Дескриптор предыдущего дочернего окна</param>
        ///// <param name="lpszClass">Класс окна</param>
        ///// <param name="lpszWindow">Заголовок окна</param>
        ///// <returns>Дескриптор найденого окна</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr FindWindowEx(HandleRef hWndParent, HandleRef hwndChildAfter,
        //    string lpszClass, string lpszWindow);

        ///// <summary>Найти окно</summary>
        ///// <param name="hWndParent">Дескриптор окна-предка</param>
        ///// <param name="ChildAfter">Предыдущее дочернее окно</param>
        ///// <param name="ClassName">Имя класса</param>
        ///// <param name="WindowTitle">Заголовок</param>
        ///// <returns>Дескриптор найденного окна</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr FindWindowEx(HandleRef hWndParent, HandleRef ChildAfter,
        //    string ClassName, IntPtr WindowTitle);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr WindowFromPoint(WindowsAPI.POINT POINT);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern int EnumWindows(EnumWindowProc hWnd, IntPtr lParam);

        ///// <summary>Свернуть окно</summary>
        ///// <param name="hWnd">Дискриптор окна</param>
        ///// <returns>Истина, если окно удалось свернуть</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool CloseWindow(HandleRef hWnd);

        ///// <summary>Свернуть окно</summary>
        ///// <param name="hWnd">Дискриптор окна</param>
        ///// <returns>Истина, если окно удалось свернуть</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool CloseWindow(IntPtr hWnd);

        ///// <summary>Уничтожить окно</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <returns>Истина, если окно уничтожено</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool DestroyWindow(HandleRef hWnd);

        ///// <summary>Уничтожить окно</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <returns>Истина, если окно уничтожено</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool DestroyWindow(IntPtr hWnd);

        ///// <summary>Установить окно по верх остальных</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <returns>Истина, если удалось установить окно поверх остальных</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool SetForegroundWindow(HandleRef hWnd);

        ///// <summary>Установить окно по верх остальных</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <returns>Истина, если удалось установить окно поверх остальных</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool SetForegroundWindow(IntPtr hWnd);

        ///// <summary>Получить дескриптор верхнего окна</summary>
        ///// <returns>Дескриптор верхнего окна</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr GetForegroundWindow();

        ///// <summary>
        ///// Если функция завершается успешно, величина возвращаемого 
        ///// значения - дескриптор активного окна, связанного с потоком, 
        ///// который вызывает функцию. Если вызывающий поток не имеет активного 
        ///// окна, величина возвращаемого значения - ПУСТО
        ///// </summary>
        ///// <returns>Дескриптор окна</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr GetActiveWindow();

        ///// <summary>Получить текст окна</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <param name="lpString">Текст</param>
        ///// <param name="nMaxCount">Число символов</param>
        ///// <returns>Текст окна</returns>
        //[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        //public static extern int GetWindowText(HandleRef hWnd, StringBuilder lpString, uint nMaxCount);

        ///// <summary>Получить текст окна</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <param name="lpString">Текст</param>
        ///// <param name="nMaxCount">Число символов</param>
        ///// <returns>Текст окна</returns>
        //[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        //public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, uint nMaxCount);

        ///// <summary>Число символов текста окна</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <returns>Число символов текста окна</returns>
        //[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        //public static extern int GetWindowTextLength(HandleRef hWnd);

        ///// <summary>Число символов текста окна</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <returns>Число символов текста окна</returns>
        //[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        //public static extern int GetWindowTextLength(IntPtr hWnd);

        ///// <summary>Установить текст окна</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <param name="lpString">Текст окна</param>
        ///// <returns>Истина, если удалось</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool SetWindowText(HandleRef hWnd, string lpString);

        ///// <summary>Установить текст окна</summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <param name="lpString">ТЕкст окна</param>
        ///// <returns>Истина, если удалось</returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool SetWindowText(IntPtr hWnd, string lpString);

        //[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        //public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

        //public static class SystemMenu
        //{
        //    [Serializable, Flags]
        //    public enum Flags : uint
        //    {
        //        MF_REMOVE = 0x00001000,
        //        MF_BYPOSITION = 0x00000400
        //    }

        //    [DllImport("user32.dll", SetLastError = true)]
        //    public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        //    [DllImport("user32.dll", SetLastError = true)]
        //    public static extern int GetMenuItemCount(IntPtr hMenu);

        //    [DllImport("user32.dll", SetLastError = true)]
        //    public static extern bool DrawMenuBar(IntPtr hWnd);

        //    [DllImport("user32.dll", SetLastError = true)]
        //    public static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, Flags uFlags);
        //}

        //[Serializable]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr lParam);
        //[DllImport("user32", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool EnumChildWindows(IntPtr hWmd, EnumWindowProc callback, IntPtr lParam);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern int GetWindowRect(IntPtr hWnd, ref WindowsAPI.RECT RECT);

        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool SetWindowPos(IntPtr hWnd, InsertAfterEnum hWndInsertAfter,
        //    int x, int y, int cx, int cy, SetWindowPosFlags uFlags);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
        //    int X, int Y, int cx, int cy, uint uFlags);

        ///// <summary>
        ///// Функция MoveWindow изменяет позицию и габариты определяемого окна. Для окна верх-него уровня, позиция и 
        ///// габариты - относительно левого верхнего угла экрана. Для дочернего окна, они - относительно левого верхнего 
        ///// угла рабочей области родительского окна.
        ///// </summary>
        ///// <param name="hWnd">Идентификатор окна</param>
        ///// <param name="X">Положение левого верхнего угла окна по оси X</param>
        ///// <param name="Y">Положение левого верхнего угла окна по оси Y</param>
        ///// <param name="nWidth">Ширина окна</param>
        ///// <param name="nHeight">Высота окна</param>
        ///// <param name="bRepaint">Определяет, должно ли окно быть перекрашено. Если этот параметр - ИСТИНА (TRUE), 
        ///// окно принимает сообщение WM_PAINT. Если параметр - ЛОЖЬ(FALSE), никакого перекрашивания какого-либо сорта 
        ///// не происходит. Это применяется к рабочей области, нерабочей области (включая строку заголовка и линейки 
        ///// прокрутки) и любой части родительского окна, раскрытого в результате перемещения дочернего окна. 
        ///// Если этот параметр - ЛОЖЬ(FALSE), прикладная программа должна явно аннулировать или перерисовать любые 
        ///// части окна и родительского окна, которые нуждаются в перерисовке.</param>
        ///// <returns>Если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела 
        ///// неудачу, возвращаемое значение - ноль</returns>
        ///// <remarks>Если параметр bRepaint - ИСТИНА (TRUE), Windows посылает сообщение WM_PAINT оконной процедуре 
        ///// немедленно после перемещения окна (то есть функция MoveWindow вызывает функцию UpdateWindow). 
        ///// Если bRepaint - ЛОЖЬ(FALSE), Windows помещает сообщение WM_PAINT в очередь сообщений, связанную с окном. 
        ///// Цикл сообщений посылает сообщение WM_PAINT только после диспетчеризации всех других сообщений в очереди. 
        ///// Функция MoveWindow посылает в окно сообщения WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, 
        ///// WM_MOVE, WM_SIZE и WM_NCCALCSIZE.</remarks>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr GetWindowDC(IntPtr hWnd);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC_Handle);

        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);

        //[DllImport("user32.dll")]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool IsWindowEnabled(IntPtr hWnd);

        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, uint crKey,
        //    byte bAlpha, uint dwFlags);
        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, uint crKey,
        //    byte bAlpha, LWA dwFlags);

        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool GetLayeredWindowAttributes(IntPtr hWnd, out uint crKey, out byte bAlpha,
        //    out uint dwFlags);
        //[DllImport("user32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //public static extern bool GetLayeredWindowAttributes(IntPtr hWnd, out uint crKey, out byte bAlpha,
        //    out LWA dwFlags);

        ///// <summary>
        ///// Функция SetWindowLong изменяет атрибуты определяемого окна. 
        ///// Функция также устанавливает 32-разрядное (длинное) значение 
        ///// при заданном смещении в дополнительном пространстве памяти об окне
        ///// </summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <param name="nIndex">
        ///// Определяет значение смещения, отсчитываемое от нуля, которое будет установлено. 
        ///// Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительного 
        ///// пространства в памяти, минус 4; например, если бы Вы установили 12 или большее 
        ///// количество байтов памяти дополнительного пространства, значение 8 было бы индексом 
        ///// к третьему 32-разрядному целому числу.
        ///// </param>
        ///// <param name="dwNewLong">Устанавливает восстановленное значение</param>
        ///// <returns>
        ///// Если функция завершается успешно, возвращаемое значение - предыдущее значение 
        ///// заданного 32-разрядного целого числа. Если функция не выполняет задачу, 
        ///// возвращаемое значение нулевое
        ///// </returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
        ///// <summary>
        ///// Функция SetWindowLong изменяет атрибуты определяемого окна. 
        ///// Функция также устанавливает 32-разрядное (длинное) значение 
        ///// при заданном смещении в дополнительном пространстве памяти об окне
        ///// </summary>
        ///// <param name="hWnd">Дескриптор окна</param>
        ///// <param name="nIndex">
        ///// Определяет значение смещения, отсчитываемое от нуля, которое будет установлено. 
        ///// Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительного 
        ///// пространства в памяти, минус 4; например, если бы Вы установили 12 или большее 
        ///// количество байтов памяти дополнительного пространства, значение 8 было бы индексом 
        ///// к третьему 32-разрядному целому числу.
        ///// </param>
        ///// <param name="dwNewLong">Устанавливает восстановленное значение</param>
        ///// <returns>
        ///// Если функция завершается успешно, возвращаемое значение - предыдущее значение 
        ///// заданного 32-разрядного целого числа. Если функция не выполняет задачу, 
        ///// возвращаемое значение нулевое
        ///// </returns>
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, WS dwNewLong);
        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);


        //// This static method is required because legacy OSes do not support
        //// SetWindowLongPtr 
        //public static IntPtr SetWindowLongPtr(HandleRef hWnd, int nIndex, IntPtr dwNewLong)
        //{
        //    return IntPtr.Size == 8
        //            ? SetWindowLongPtr64(hWnd, nIndex, dwNewLong)
        //            : new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
        //}

        //[DllImport("user32.dll", EntryPoint = "SetWindowLong", SetLastError = true)]
        //private static extern int SetWindowLong32(HandleRef hWnd, int nIndex, int dwNewLong);

        //[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", SetLastError = true)]
        //private static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, IntPtr dwNewLong);

        //[DllImport("user32.dll", SetLastError = true)]
        //public static extern void DisableProcessWindowsGhosting();
    }

    public static class UxTheme
    {
        public const string FileName = "UxTheme.dll";

        [DllImport(FileName, SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern IntPtr SetWindowTheme(IntPtr hWnd, string pszSubAppName, string pszSubIdList);
    }

}
